package application;

import controleur.ConnexionBD;
import controleur.ConstantesWeb;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class MembreDAO
{
    /**
     * Transforme un ResultSet en liste de MembreBean
     * @param set
     * @return 
     */
    private static List<MembreBean> getMembres(final ResultSet set)
    {
        List<MembreBean> membresBeanListe = new ArrayList<MembreBean>();
        
        try {
            if (set != null) {
                while (set.next()) {
                    Membre m = new Membre();
                    
                    m.setAdresse(set.getString("adresse"));
                    m.setCourriel(set.getString("courriel"));
                    m.setIdMembre(set.getString("id_membre"));
                    m.setMotPasse(set.getString("motPasse"));
                    m.setNomFamille(set.getString("nom_de_famille"));
                    m.setNomUtilisateur(set.getString("nom_utilisateur"));
                    m.setPrenom(set.getString("prenom"));
                    m.setTelephone(set.getString("telephone"));
                    m.setIdVille(set.getString("id_ville"));
                    m.setIdCompte(set.getString("id_compte"));
                    m.setIdImage(set.getString("id_image"));
                    
                    membresBeanListe.add(m.getMembreBean());
                }
            }
        } catch (Exception e) {
            System.err.println("Error in getMembres: " + e    );
        }
        
        return membresBeanListe;
    }
    
    /**
     * Retourne la liste de membre selon son nom d'utilisateur et
     * son mot de passe.
     * @param nomUtilisateur
     * @param motPasse
     * @return 
     */
    public static List<MembreBean> getMembre(final String nomUtilisateur, final String motPasse)
    {
        final String query = "select *, AES_DECRYPT(mot_de_passe, ?) motPasse from membre "
                + "where nom_utilisateur = ? "
                + "and mot_de_passe = AES_ENCRYPT(?, ?)";
        List<MembreBean> mbean;
        
        ConnexionBD con = new ConnexionBD();
        mbean = MembreDAO.getMembres(con.execute_query(query, ConstantesWeb.CLE_CRYPTAGE,
                nomUtilisateur, motPasse, ConstantesWeb.CLE_CRYPTAGE));
        con.close();
        
        return mbean;
    }
    
    /**
     * Retourne la liste de membre ayant idMembre.
     * @param idMembre
     * @return 
     */
    public static List<MembreBean> getMembre(final String idMembre)
    {
        final String query = "select *, AES_DECRYPT(mot_de_passe, ?) motPasse "
                + "from membre where id_membre=?";
        List<MembreBean> mbean;
        
        ConnexionBD con = new ConnexionBD();
        mbean = MembreDAO.getMembres(con.execute_query(query, 
                ConstantesWeb.CLE_CRYPTAGE, idMembre));
        con.close();
        
        return mbean;
    }
    
    /**
     * Retourne la liste des membres ayant le nom d'utilisateur.
     * @param nomUtilisateur
     * @return 
     */
    public static List<MembreBean> getMembreUtilisateur(final String nomUtilisateur) {
        final String query = "select *, AES_DECRYPT(mot_de_passe, ?) motPasse from membre "
                + "where nom_utilisateur = ?";
        List<MembreBean> mbean;
        
        ConnexionBD con = new ConnexionBD();
        mbean = MembreDAO.getMembres(con.execute_query(query, ConstantesWeb.CLE_CRYPTAGE,
                nomUtilisateur));
        con.close();
        
        return mbean;
    }
    
    /**
     * Mêt à jour un membre
     * @param m
     * @return 
     */
    public static int updateMembre(final MembreBean m)
    {
        final String query = "update membre "
                + "set courriel=?, "
                + "prenom=?, "
                + "nom_de_famille=?, "
                + "adresse=?, "
                + "id_ville=?, "
                + "telephone=?, "
                + "mot_de_passe=AES_ENCRYPT(?,'" + ConstantesWeb.CLE_CRYPTAGE + "') "
                + "where id_membre=?";
        int r;
        
        ConnexionBD con = new ConnexionBD();
        r = con.execute_update(query, m.getCourriel(), m.getPrenom(),
                m.getNomFamille(), m.getAdresse(), m.getIdVille(),
                m.getTelephone(), m.getMotPasse(), m.getIdMembre());
        con.close();
        
        return r;
    }
    
    /**
     * Retourne la liste des membres
     * @return 
     */
    public static List<MembreBean> getMembres()
    {
        final String query = "select *,  AES_DECRYPT(mot_de_passe, ?) motPasse from membre"
                + " order by nom_utilisateur";
        List<MembreBean> mbean;
        
        ConnexionBD con = new ConnexionBD();
        mbean = MembreDAO.getMembres(con.execute_query(query, ConstantesWeb.CLE_CRYPTAGE));
        con.close();
        
        return mbean;
    }
    
    /**
     * Crée un membre
     * @param m
     * @return 
     */
    public static int creerMembre(final MembreBean m)
    {
        final String query = "INSERT INTO membre ("
                + "courriel, "
                + "prenom, "
                + "nom_de_famille, "
                + "adresse, "
                + "id_ville, "
                + "telephone, "
                + "nom_utilisateur, "
                + "mot_de_passe, "
                + "id_compte, "
                + "id_image) "
                + "VALUES (?, ?, ?, ?, ?, ?, ?, "
                + "AES_ENCRYPT(?,'" + ConstantesWeb.CLE_CRYPTAGE + "'), ?, ?)";
        
        int r;
        
        ConnexionBD con = new ConnexionBD();
        r = con.execute_update(query, m.getCourriel(), m.getPrenom(), 
                m.getNomFamille(), m.getAdresse(), m.getIdVille(), 
                m.getTelephone(), m.getNomUtilisateur(), m.getMotPasse(),
                m.getIdCompte(), m.getIdImage());
        con.close();

        return r;
    }
}
